Ministrante: Wasim Aluísio Prates Syed, Farmacêutico pela FCFRP-USP, doutorando em biotecnologia pelo ICB/IPT/Butantan, e divulgador científico pela UPVacina (IEARP-USP) e Projeto Halo (ONU).
Descrição do curso:
Desenvolvemos um curso para tornar o aprendizado de uma das linguagens de programação e análise de dados mais populares mais acessível, especialmente para aqueles que não têm formação em áreas de exatas, como TI e ciência da computação. Esta linguagem é amplamente utilizada por cientistas devido à sua variedade de ferramentas para análise de dados em ciências biológicas e da saúde. Com uma abordagem prática e interativa, os participantes explorarão conceitos e ferramentas para realizar análises de dados de forma simples e intuitiva. Além disso, terão acesso a um grupo de discussão para compartilhar dúvidas e ideias, criando um ambiente colaborativo e de aprendizado mútuo.
Programação e conteúdo
Os participantes terão uma aula introdutória à ciência de dados e fundamentos da manipulação de dados no R e visualização de dados com o ggplot, no ambiente do RStudio. Em seguida, os participantes terão um tempo para praticar e desenvolver as análises com 5 países de escolha, e no final deverão criar um poster com os gráficos produzidos.
Introdução ao R: Explicaremos por que o R é importante para cientistas e profissionais da saúde.
Fundamentos da Programação em R: Abordaremos conceitos como funções, pacotes, variáveis e estruturas de dados, como data frames, listas e matrizes.
Manipulação e Visualização de Dados: Exploraremos técnicas para importar, limpar, filtrar e visualizar dados usando pacotes do Tidyverse, como dplyr e ggplot2.
Análise Exploratória de Dados: Realizaremos análises exploratórias de dados, incluindo estatísticas descritivas, gráficos e interpretação de resultados. Aplicaremos os conhecimentos adquiridos em um projeto prático com dados reais de saúde, incluindo análise de vacinação e indicadores de saúde pública.
Para rodar este tutorial, siga os seguintes passos:
Passo 1: Acesse o GitHub
Passo 2: Baixe o projeto
No repositório do GitHub, clique no botão verde “Code”.
Selecione “Download ZIP”. Isso iniciará o download do arquivo ZIP contendo o projeto.
Passo 3: Descompacte o arquivo ZIP
Após o download ser concluído, localize o arquivo ZIP em sua pasta de downloads.
Clique com o botão direito do mouse no arquivo ZIP e selecione “Extrair tudo” ou “Descompactar”.
Escolha a pasta de destino onde deseja descompactar o arquivo e clique em “Extrair”.
Passo 4: Configure o projeto no RStudio
Abra o RStudio em seu computador.
No menu do RStudio, clique em “File” (Arquivo) e selecione “New Project” (Novo Projeto).
Escolha a opção “Existing Directory” (Diretório Existente).
Navegue até a pasta onde você descompactou o projeto.
Selecione a pasta do projeto com um clique.
Clique em “Create Project” (Criar Projeto).
Pronto! Agora você configurou o projeto do GitHub em seu RStudio e está pronto para começar a trabalhar.
Para encontrar este documento com as linhas de
códigos, clique no arquivo
“Introducao_analise_exploratoria.rmd”.
Antes de rodarmos os códigos para as análises, é necessário instalar
os pacotes cujos recursos, especialmente as funções, serão utilizados.
Para isso, use o install.packages("pacote").
Nem sempre é necessário reinstalar os pacotes, pois isso toma tempo. Entretanto, é recomendável reinstalar os pacotes de vez em quando, para atualizar o pacote.
Observe que o código abaixo está com # antes da função. Ao rodar pela primeira vez, retire estes # e execute.
options(repos = c(CRAN = "https://cran.r-project.org"))
# Baixar pacotes do CRAN para a biblioteca
# install.packages("tidyverse")
# install.packages("skimr")
# install.packages("janitor")
# install.packages("esquisse")
# install.packages("ggthemes")
# install.packages("plotly")
# install.packages("gghighlight")
# install.packages("patchwork")
# install.packages("ggsci")
# install.packages("gapminder")
Após a instalação, a cada vez que você fechar o ambiente do R, você
deverá chamar os pacotes da biblioteca com a função
library().
Lembre-se sempre de chamar os pacotes quando você iniciar uma nova sessão!
# Chamando os pacotes da biblioteca
library(tidyverse) #Metapacote
library(skimr) #Diagnóstico de tabela
library(janitor) #Limpeza de tabelas
library(esquisse) #Plotagem de gráficos prática
library(ggthemes) #Temas de ggplot
library(plotly) #Gráficos interativos
library(patchwork) #Unir gráficos
library(gghighlight) #Marcar pontos e linhas
library(ggsci) #Paleta de cores
library(gapminder)
Podemos criar variáveis de diferentes classes, como numéricas (integer, double), textuais (string/character), e muitas outras. Além disso, essas variáveis podem ser nomeadas com o nome que você quiser, como letras e palavras.
Entretanto, não podem ter espaço entre si (variavel_a != variavel a) e, por mais que funcionem com palavras em portugues acentuadas (“multiplicacão”), é uma boa prática nomeá-las da forma mais simples possível.
#Operações básicas -----
#Variáveis numéricas
x = 5
x
## [1] 5
y = 7
y
## [1] 7
z = y + x
z
## [1] 12
multiplicacão = x * y
multiplicacão
## [1] 35
As variáveis textuais são sempre definidas com aspas, mesmo sendo um
número, como string = "5".
# Variáveis textuais (characters, string)
a = "Olá" #Uma palavra
a
## [1] "Olá"
b = "Tudo bem?" #Uma frase
b
## [1] "Tudo bem?"
Operações lógicas
Se usarmos operadores lógicos para determinar se o conteúdo de uma
variável é igual (==), diferente (!=), maior
(>) ou menor (<), os resultados
retornarão TRUE ou FALSE.
# Comparações lógicas (booleanas)
a == b #Igual?
## [1] FALSE
a != b #Diferente?
## [1] TRUE
x < y # Menor?
## [1] TRUE
x > y # Maior?
## [1] FALSE
x <= 5 # Menor ou igual?
## [1] TRUE
E, se criarmos outras variáveis com nomes diferentes, mas com os mesmos valores, elas ainda continuarão dando o mesmo resultado.
aa = "Olá"
aa == a
## [1] TRUE
Os vetores são uma sequência unidimensional que podem ser números, strings, valores lógicos, entre outros. Podemos criar vetores com a função c(), de “concatenar”.
# Vetores
i = c(7, 5, 9, 10)
i
## [1] 7 5 9 10
j = c("Olá", "Caneta", "Qualificacao")
j
## [1] "Olá" "Caneta" "Qualificacao"
Perceba que, para um vetor ser classificado como numérico, todos os elementos têm de ser números, isto é, não estar dentro de aspas. Do contrário, se um elemento for uma string (contiver aspas), mesmo com um número dentro, do vetor inteiro será convertido em strings.
h = c(7, "10", 78)
h
## [1] "7" "10" "78"
O c() é um exemplo de função. Toda função contem um nome
seguido por parenteses. No caso da função c(), inserimos os
elementos que temos interesse.
No entanto, outras funções que iremos aprender a seguir funcionam de
forma diferente, muitas vezes intuitiva. Para acessar a documentação da
função, use um ? antes da função e aguarde a aba de ajuda
abrir.
# O que esta função faz? Use o "?" antes da função e rode.
?c()
Dataframes e tibbles são tabelas comuns e consistem de linhas e colunas de diferentes classes, como números, caracteres e fatores.
As tibbles são diferentes dos dataframes somente em sua apresentação no console e facilitam muito o trabalho com tabelas grandes e largas.
Além disso, a criação do dataframe e da tibble são diferentes
visualmente. Enquanto no dataframe usamos a função
data.frame() para criar colunas com linhas definidas por um
vetor, na tibble esse código é semelhante à forma que imputamos dados no
excel.
#Dataframes e tibbles -----
#Dataframe
data = data.frame(
nome = c("Gabriela", "Júlia", "Beatriz", "Luiza"),
altura = c(1.59, 1.60, 1.78, 1.73),
idade = c(30, 25, 31, 32)
)
data
## nome altura idade
## 1 Gabriela 1.59 30
## 2 Júlia 1.60 25
## 3 Beatriz 1.78 31
## 4 Luiza 1.73 32
E para criar uma tibble, usamos a função tribble().
#Tibble
tibble = tribble(
~nome, ~altura, ~idade,
"Gabriela", 1.59, 30,
"Júlia", 1.60, 25,
"Beatriz", 1.65, 31,
"Luiza", 1.73, 32
)
tibble
## # A tibble: 4 × 3
## nome altura idade
## <chr> <dbl> <dbl>
## 1 Gabriela 1.59 30
## 2 Júlia 1.6 25
## 3 Beatriz 1.65 31
## 4 Luiza 1.73 32
É possível transformar quase todo objeto em uma tabela.
Por exemplo, se pegarmos os vetores criados anteriormente e usarmos a
função as.data.frame(), será criada uma coluna com o nome
do vetor, seguida por linhas contendo os elementos do vetor.
# Vetores em dataframe
as.data.frame(i) #dataframe com coluna numérica
## i
## 1 7
## 2 5
## 3 9
## 4 10
as.data.frame(j) #dataframe com coluna textual
## j
## 1 Olá
## 2 Caneta
## 3 Qualificacao
as.data.frame(h) #dataframe com coluna textual, mesmo com valores numéricos
## h
## 1 7
## 2 10
## 3 78
Há diferentes formas de se visualizar uma tabela.
A diferença de cada objeto está na visualização no console e no documento. Teste estas linhas de código no documento Markdown e no console.
#Visualizando o dataframe -----
# Com print()
print(data) #No documento ou console
## nome altura idade
## 1 Gabriela 1.59 30
## 2 Júlia 1.60 25
## 3 Beatriz 1.78 31
## 4 Luiza 1.73 32
print(tibble)
## # A tibble: 4 × 3
## nome altura idade
## <chr> <dbl> <dbl>
## 1 Gabriela 1.59 30
## 2 Júlia 1.6 25
## 3 Beatriz 1.65 31
## 4 Luiza 1.73 32
# Com nome do objeto
data
## nome altura idade
## 1 Gabriela 1.59 30
## 2 Júlia 1.60 25
## 3 Beatriz 1.78 31
## 4 Luiza 1.73 32
tibble
## # A tibble: 4 × 3
## nome altura idade
## <chr> <dbl> <dbl>
## 1 Gabriela 1.59 30
## 2 Júlia 1.6 25
## 3 Beatriz 1.65 31
## 4 Luiza 1.73 32
# Com glimpse(). #Descrição mais completa da tabela
glimpse(data)
## Rows: 4
## Columns: 3
## $ nome <chr> "Gabriela", "Júlia", "Beatriz", "Luiza"
## $ altura <dbl> 1.59, 1.60, 1.78, 1.73
## $ idade <dbl> 30, 25, 31, 32
glimpse(tibble)
## Rows: 4
## Columns: 3
## $ nome <chr> "Gabriela", "Júlia", "Beatriz", "Luiza"
## $ altura <dbl> 1.59, 1.60, 1.65, 1.73
## $ idade <dbl> 30, 25, 31, 32
# Com view() ou View(). A tabela completa com mais funcionalidades (filtragem manual, pesquisa e ordenamento) abrirá em uma nova janela
view(data)
view(tibble)
# Selecione o nome do objeto, segure Ctrl e clique com o botão direito do mouse.
data
## nome altura idade
## 1 Gabriela 1.59 30
## 2 Júlia 1.60 25
## 3 Beatriz 1.78 31
## 4 Luiza 1.73 32
tibble
## # A tibble: 4 × 3
## nome altura idade
## <chr> <dbl> <dbl>
## 1 Gabriela 1.59 30
## 2 Júlia 1.6 25
## 3 Beatriz 1.65 31
## 4 Luiza 1.73 32
O R possui uma função muito prática de análise estatística
descritiva, a summary().
No entanto, existem outros pacotes que realizam essas análises e até geram relatórios em HTML.
Um deles é o skimr, cuja função skim() gera três
outputs, um semelhante ao summary, e outras duas tabelas com a
quantidade de valores não disponíveis (NA), estatísticas descritivas, e
um histograma.
# Estatísticas gerais
summary(tibble)
## nome altura idade
## Length:4 Min. :1.590 Min. :25.00
## Class :character 1st Qu.:1.597 1st Qu.:28.75
## Mode :character Median :1.625 Median :30.50
## Mean :1.643 Mean :29.50
## 3rd Qu.:1.670 3rd Qu.:31.25
## Max. :1.730 Max. :32.00
summary(data)
## nome altura idade
## Length:4 Min. :1.590 Min. :25.00
## Class :character 1st Qu.:1.597 1st Qu.:28.75
## Mode :character Median :1.665 Median :30.50
## Mean :1.675 Mean :29.50
## 3rd Qu.:1.742 3rd Qu.:31.25
## Max. :1.780 Max. :32.00
# Usando skim
skim(tibble)
| Name | tibble |
| Number of rows | 4 |
| Number of columns | 3 |
| _______________________ | |
| Column type frequency: | |
| character | 1 |
| numeric | 2 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| nome | 0 | 1 | 5 | 8 | 0 | 4 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| altura | 0 | 1 | 1.64 | 0.06 | 1.59 | 1.60 | 1.62 | 1.67 | 1.73 | ▇▁▃▁▃ |
| idade | 0 | 1 | 29.50 | 3.11 | 25.00 | 28.75 | 30.50 | 31.25 | 32.00 | ▃▁▁▃▇ |
skim(data)
| Name | data |
| Number of rows | 4 |
| Number of columns | 3 |
| _______________________ | |
| Column type frequency: | |
| character | 1 |
| numeric | 2 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| nome | 0 | 1 | 5 | 8 | 0 | 4 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| altura | 0 | 1 | 1.68 | 0.09 | 1.59 | 1.60 | 1.67 | 1.74 | 1.78 | ▇▁▁▃▃ |
| idade | 0 | 1 | 29.50 | 3.11 | 25.00 | 28.75 | 30.50 | 31.25 | 32.00 | ▃▁▁▃▇ |
As tabelas tidy possuem dois formatos, um largo (wide) e outro longo (long). Converter uma em outra é conhecido como pivotagem, e conhecer essas funções é importantíssimo para obter, manipular e explorar dados.
Para pivotar, utilizamos pivot_longer() e
pivot_wider(). A pivotagem deve ser pensada com base na
relação entre variáveis e seus valores.
Por exemplo, se tivermos uma tabela larga com 10 colunas com anos (de 1990 a 2000), podemos reduzi-las em uma só coluna chamada “anos”, que facilitará a manipulação de dados. Isso alongará a tabela.
No exemplo abaixo, simplificamos todas as variáveis
(idade e altura) em uma coluna
(variavel), e jogamos os valores para uma única coluna
(valor).
# Trabalhando com dataframes -----
#Transformando outros formatos em dataframe
# Long table
data_long = pivot_longer(data, #Tabela
cols = c(altura, idade), #Colunas para alongar
values_to = "valor", # Estocar valores em uma nova coluna
names_to = "variavel" # Estocar variáveis em uma nova coluna
)
data
## nome altura idade
## 1 Gabriela 1.59 30
## 2 Júlia 1.60 25
## 3 Beatriz 1.78 31
## 4 Luiza 1.73 32
data_long
## # A tibble: 8 × 3
## nome variavel valor
## <chr> <chr> <dbl>
## 1 Gabriela altura 1.59
## 2 Gabriela idade 30
## 3 Júlia altura 1.6
## 4 Júlia idade 25
## 5 Beatriz altura 1.78
## 6 Beatriz idade 31
## 7 Luiza altura 1.73
## 8 Luiza idade 32
Mas, se quisermos deixá-la mais fácil de ser interpretada por humanos, podemos pivotá-la em uma tabela larga, igual à tabela original.
# Wide table
data_wide = pivot_wider(data_long, #Tabela
names_from = variavel, #Dividir níveis de uma coluna em novas colunas
values_from = valor) #Estocar valores relacionados à coluna nome e novas variáveis)
data_wide
## # A tibble: 4 × 3
## nome altura idade
## <chr> <dbl> <dbl>
## 1 Gabriela 1.59 30
## 2 Júlia 1.6 25
## 3 Beatriz 1.78 31
## 4 Luiza 1.73 32
É importante saber manipular matrizes para computar análises estatísticas, como a Principal Components Analysis.
As matrizes são estruturas tabelares cujos valores são somente numéricos. Ou seja, não podemos ter uma coluna com strings, por exemplo.
Para isso, é necessário converter a coluna de “nomes” (strings) em
nomes de linhas (rownames) usando a função
column_to_rownames(), e então converter a tabela em matriz,
com o as.matrix().
A diferença aqui é a apresentação da tabela. Enquanto dataframes e tibbles são facilmente lidas, as matrizes são mais complicadas nesse sentido.
#Matriz
matrix = as.matrix(data) #Transformar tabela em matriz
matrix #Os valores numéricos são strings
## nome altura idade
## [1,] "Gabriela" "1.59" "30"
## [2,] "Júlia" "1.60" "25"
## [3,] "Beatriz" "1.78" "31"
## [4,] "Luiza" "1.73" "32"
data_matrix = column_to_rownames(data, "nome") #Converte coluna em rownames
matrix = as.matrix(data_matrix)
matrix #Agora, os valores são numéricos
## altura idade
## Gabriela 1.59 30
## Júlia 1.60 25
## Beatriz 1.78 31
## Luiza 1.73 32
Caso você queira manipular a matriz com as funções do tidyverse, é recomendável reconvertê-la em dataframe/tibble, manipular os dados, e depois converter novamente para matriz.
# Reconverter para dataframe
matrix_dr = as.data.frame(matrix)
matrix_dr # Coluna "nome" continua como rownames e dificulta a manipulação.
## altura idade
## Gabriela 1.59 30
## Júlia 1.60 25
## Beatriz 1.78 31
## Luiza 1.73 32
matrix_dr = rownames_to_column(matrix_dr, "nome") #Converter rownames em nova coluna
matrix_dr
## nome altura idade
## 1 Gabriela 1.59 30
## 2 Júlia 1.60 25
## 3 Beatriz 1.78 31
## 4 Luiza 1.73 32
Listas são estruturas que podem conter um conjunto de elementos de diferentes classes, como vetores, outras listas, dataframes, e matrizes.
Elas são interessantes para organizar os objetos necessários para uma análise, e são muito comuns em análises de RNAseq, por exemplo.
#Criando a lista
lista = list(a, b, h, j, multiplicacão, data, matrix, tibble)
#View(lista) #Visualizando a lista
#Acessando objetos diferentes da lista
lista[[1]] #Primeiro objeto
## [1] "Olá"
lista[[8]] #Oitavo objeto
## # A tibble: 4 × 3
## nome altura idade
## <chr> <dbl> <dbl>
## 1 Gabriela 1.59 30
## 2 Júlia 1.6 25
## 3 Beatriz 1.65 31
## 4 Luiza 1.73 32
#Isolando o objeto
df_list = lista[[8]]
df_list
## # A tibble: 4 × 3
## nome altura idade
## <chr> <dbl> <dbl>
## 1 Gabriela 1.59 30
## 2 Júlia 1.6 25
## 3 Beatriz 1.65 31
## 4 Luiza 1.73 32
O R possui funções e formas nativas de acessar e manipular tabelas. Essas operações, como as descritas abaixo, não são mais a melhor forma de trabalhar, pois são pouco intuitivas. Mas, é importante conhecê-las, pois, são utilizadas em alguns casos.
# Acessando colunas do data frame
data$nome
## [1] "Gabriela" "Júlia" "Beatriz" "Luiza"
data$idade
## [1] 30 25 31 32
# Criando nova variável para não sobrescrever a tabela original para os próximos exemplos
data_2 = data
# Adicionando uma nova coluna ao data frame
data_2$peso = c(70,
65,
80,
20)
data_2
## nome altura idade peso
## 1 Gabriela 1.59 30 70
## 2 Júlia 1.60 25 65
## 3 Beatriz 1.78 31 80
## 4 Luiza 1.73 32 20
# Removendo uma coluna do data frame
data_2 = data_2[ , -4]
# Filtrando linhas do data frame. df[linha, coluna]
data_jovens = data_2[data_2$idade < 30, ]
data_jovens
## nome altura idade
## 2 Júlia 1.6 25
# Ordenando o data frame por uma coluna
data_ordenados <- data_2[order(data_2$idade), ]
data_ordenados
## nome altura idade
## 2 Júlia 1.60 25
## 1 Gabriela 1.59 30
## 3 Beatriz 1.78 31
## 4 Luiza 1.73 32
O tidyverse é um metapacote, um pacote com diversos pacotes dentro, que facilita muito o trabalho no R. As funções conversam entre si, são padronizadas e, mais importante, são muito intuitivas.
add_row() e add_column(): Adicionando
linhas e colunasPara adicionar uma linha com valores, usamos o
add_row(), e para adicionar uma nova coluna com valores,
usamos o add_column(). Bem intuitivo, né?
Para não alterarmos as tabelas originais, criamos uma nova variável
chamada data_2 e tibble_2. Entretanto, não é
necessário sempre criar uma variável para cada operação que
fizermos.
#Adicionar linha
data_2 = add_row(data,
nome = "Rafaela",
idade = 50,
altura = 1.85)
data_2
## nome altura idade
## 1 Gabriela 1.59 30
## 2 Júlia 1.60 25
## 3 Beatriz 1.78 31
## 4 Luiza 1.73 32
## 5 Rafaela 1.85 50
tibble_2 = add_row(tibble,
nome = "Rafaela",
idade = 50,
altura = 1.85)
tibble_2
## # A tibble: 5 × 3
## nome altura idade
## <chr> <dbl> <dbl>
## 1 Gabriela 1.59 30
## 2 Júlia 1.6 25
## 3 Beatriz 1.65 31
## 4 Luiza 1.73 32
## 5 Rafaela 1.85 50
#Adicionar coluna
data_2 = add_column(data_2,
peso = c(50,
80,
40,
100,
70))
data_2
## nome altura idade peso
## 1 Gabriela 1.59 30 50
## 2 Júlia 1.60 25 80
## 3 Beatriz 1.78 31 40
## 4 Luiza 1.73 32 100
## 5 Rafaela 1.85 50 70
tibble_2 = add_column(tibble_2,
peso = c(50,
80,
40,
100,
70))
tibble_2
## # A tibble: 5 × 4
## nome altura idade peso
## <chr> <dbl> <dbl> <dbl>
## 1 Gabriela 1.59 30 50
## 2 Júlia 1.6 25 80
## 3 Beatriz 1.65 31 40
## 4 Luiza 1.73 32 100
## 5 Rafaela 1.85 50 70
filter(): Filtrando linhas e usando o pipeSempre que estivermos manipulando linhas, utilizamos o verbo
“filtrar”. No tidyverse, mais especificamente no pacote dplyr,
usamos a função filter() e estabelecemos argumentos lógicos
para a filtragem.
# Filtrando linhas ----
idade = filter(data, idade <= 30)
idade_nome = filter(idade,
nome == "Júlia")
idade_nome
## nome altura idade
## 1 Júlia 1.6 25
Mas, e se eu quiser filtrar usando mais operações?
Temos duas formas de fazer isso.
A primeira é usando “OU” (|) e %in% c().
Veja que os resultados são iguais, mas a forma de escrever é diferente.
No primeiro caso, temos de repetir “nome ==” a cada valor
que quisermos incluir. No segundo caso, somente criamos um vetor com os
valores separados por vírgula.
#Usando OU (|)
filter(data, nome == "Júlia" |
nome == "Gabriela")
## nome altura idade
## 1 Gabriela 1.59 30
## 2 Júlia 1.60 25
#Usando %in% c()
filter(data, nome %in% c("Júlia", "Gabriela"))
## nome altura idade
## 1 Gabriela 1.59 30
## 2 Júlia 1.60 25
E a segunda é usando o pipe
(%>%), que permite “costurar” operações
e resultados. Dessa forma, não precisamos criar uma variável/objeto
sempre que uma função for aplicada. Usaremos muito o pipe nos próximos
códigos.
Abaixo, pegamos uma tabela, filtramos por idade e, então, filtramos somente linhas que contêm um valor. No caso, pegamos as linhas com idade maior ou igual a 30 e, depois, aquelas que contêm o nome “Gabriela”.
# Usando o pipe "%>%" (lê-se "e então")
data %>% # Tenho este objeto
filter(idade >= 30) %>% # E então vou filtrar os indivíduos com mais de 30 anos
filter(nome == "Gabriela") # E então vou filtrar os indivíduos chamados "Gabriela"
## nome altura idade
## 1 Gabriela 1.59 30
select(): Selecionando colunasDa mesma forma que trabalhamos com linhas usando
filter(), ao trabalhar com colunas, usamos o
select().
A função select é muito versátil, e além de selecionar colunas que você quer trabalhar, podemos reordená-las e renomeá-las manualmente.
Para isolar a(s) coluna(s), use
select(coluna), que você produzirá uma tabela com somente
aquela coluna.
Para retirar uma coluna, use o - ou o
!.
Para reordenar, use
select(coluna, everything()). Aqui, você coloca a coluna de
interesse em primeiro lugar e todas as outras restantes em
sequência.
# Selecionando colunas ----
# Selecionar colunas específicas
data_2 %>%
select(nome, altura)
## nome altura
## 1 Gabriela 1.59
## 2 Júlia 1.60
## 3 Beatriz 1.78
## 4 Luiza 1.73
## 5 Rafaela 1.85
# Selecionar da coluna nome (1) à coluna peso (4)
data_2 %>%
select(nome:idade)
## nome altura idade
## 1 Gabriela 1.59 30
## 2 Júlia 1.60 25
## 3 Beatriz 1.78 31
## 4 Luiza 1.73 32
## 5 Rafaela 1.85 50
#Retirando coluna
data_2 %>%
select(-idade)
## nome altura peso
## 1 Gabriela 1.59 50
## 2 Júlia 1.60 80
## 3 Beatriz 1.78 40
## 4 Luiza 1.73 100
## 5 Rafaela 1.85 70
data_2 %>%
select(!idade)
## nome altura peso
## 1 Gabriela 1.59 50
## 2 Júlia 1.60 80
## 3 Beatriz 1.78 40
## 4 Luiza 1.73 100
## 5 Rafaela 1.85 70
#Reordenando coluna
data_2 %>%
select(idade, everything())
## idade nome altura peso
## 1 30 Gabriela 1.59 50
## 2 25 Júlia 1.60 80
## 3 31 Beatriz 1.78 40
## 4 32 Luiza 1.73 100
## 5 50 Rafaela 1.85 70
Para renomear uma coluna, é possível também usar o
select().Mas, cuidado, pois ao
renomeá-las, se esquecermos do
“everything()”, ficamos somente com a
coluna renomeada.
Por isso, temos a função
rename(), que evita que isso
aconteça.
#Renomeando coluna
data_2 %>%
select(age = idade, everything())
## age nome altura peso
## 1 30 Gabriela 1.59 50
## 2 25 Júlia 1.60 80
## 3 31 Beatriz 1.78 40
## 4 32 Luiza 1.73 100
## 5 50 Rafaela 1.85 70
#Renomeando coluna com rename
data_2 %>%
rename(age = idade) #Retirando coluna
## nome altura age peso
## 1 Gabriela 1.59 30 50
## 2 Júlia 1.60 25 80
## 3 Beatriz 1.78 31 40
## 4 Luiza 1.73 32 100
## 5 Rafaela 1.85 50 70
mutate(): Criando e realizando operações com novas
variáveisA função mutate() permite criar ou modificar
colunas e imputar valores usando funções que se aplicarão a
todas as linhas daquela coluna. Por exemplo, podemos criar a coluna imc
com o IMC todos os indivíduos, que é calculado com a razão do peso e a
altura ao quadrado.
# Criando novas variáveis
data_2 = data_2 %>%
mutate(imc = peso / (altura^2)) #Para cada linha da tabela, pegaremos o valor do peso e dividiremos pela altura ao quadrado.
Além disso, podemos criar uma coluna com o sexo daquele indivíduo. Como sabemos que todos são “feminino”, podemos fazer dessa forma.
data_2 %>%
mutate(sexo = "feminino") #Como todas as linhas contêm nomes femininos, criaremos a coluna sexo com o valor "feminino"
## nome altura idade peso imc sexo
## 1 Gabriela 1.59 30 50 19.77770 feminino
## 2 Júlia 1.60 25 80 31.25000 feminino
## 3 Beatriz 1.78 31 40 12.62467 feminino
## 4 Luiza 1.73 32 100 33.41241 feminino
## 5 Rafaela 1.85 50 70 20.45289 feminino
if_else e case_when(): CondiçõesMas, podemos também usar um argumento lógico também.
Por exemplo, podemos criar uma coluna que classificará se a pessoa
está acima ou abaixo de um IMC específico, a partir dos valores da
coluna imc.
Isso é feito com a função if_else(), que é lida da
seguinte forma: se isso for verdadeiro, dê o valor “A”, do contrário,
“B”. No caso aqui, se a pessoa tiver um IMC acima de 25, ela será
considerada com sobrepeso, e se for abaixo, será classificada como
normal.
data_2 %>%
mutate(classificacao = if_else(imc > 25, "sobrepeso", "normal"))
## nome altura idade peso imc classificacao
## 1 Gabriela 1.59 30 50 19.77770 normal
## 2 Júlia 1.60 25 80 31.25000 sobrepeso
## 3 Beatriz 1.78 31 40 12.62467 normal
## 4 Luiza 1.73 32 100 33.41241 sobrepeso
## 5 Rafaela 1.85 50 70 20.45289 normal
Mas, sabemos que o IMC pode ser classificado com outras categorias.
Para isso, temos duas formas de classificar. A primeira é usando o
if_else() imputando os valores manualmente e deixando os
valores que ainda não foram categorizados como NA, e depois, de criar a
primeira categoria, criamos a segunda categoria e deixamos os que já
estavam na coluna.
data_2 %>%
mutate(classificacao = if_else(imc >= 25 & imc <= 30 , "sobrepeso", NA),
classificacao = if_else(imc > 30, "obesidade 1", classificacao),
classificacao = if_else(imc >= 18.5 & imc <25, "normal",classificacao),
classificacao = if_else(imc < 18.5, "magreza",classificacao))
## nome altura idade peso imc classificacao
## 1 Gabriela 1.59 30 50 19.77770 normal
## 2 Júlia 1.60 25 80 31.25000 obesidade 1
## 3 Beatriz 1.78 31 40 12.62467 magreza
## 4 Luiza 1.73 32 100 33.41241 obesidade 1
## 5 Rafaela 1.85 50 70 20.45289 normal
Veja que, depois da segunda linha de if_else, isso fica confuso de
entender. Por isso, usamos o case_when(), que é um if_else
mais versátil e deixa o código mais limpo e fácil de ler.
data_2 = data_2 %>%
mutate(classificacao = case_when(imc >= 25 & imc <= 30 ~ "sobrepeso",
imc > 30 ~ "obesidade 1",
imc >= 18.5 & imc < 25 ~ "normal",
imc < 18.5 ~ "magreza"))
A função summarize() (ou summarise())
aplica a mesma lógica, mas a tabela gerada é muito menor, e se aplica à
variável de interesse na tabela. Por exemplo, se quisermos obter a média
(mean()), e a soma (sum()) das linhas de uma
coluna, a summarize é capaz de fazer isso.
# Resumindo dados
data_2 %>%
summarize(Media_idade = mean(idade))
## Media_idade
## 1 33.6
data_2 %>%
summarize(Soma_idade = sum(idade))
## Soma_idade
## 1 168
group_by: Agrupando dadosEm muitos casos, nós queremos realizar cálculos com categorias ou
grupos diferentes. Por exemplo, considere que queremos saber a média
(mean()) das idades por categoria da classificação pelo
IMC, e além disso, queremos contar os indíviduos em cada categoria
(n()). Para isso, temos de agrupar os dados por categorias
(sobrepeso, normal, etc.) de uma variável
(classificacao). Isso é feito com o group_by()
seguido pelo summarize().
#Média dos grupos
data_2 %>%
group_by(classificacao) %>%
summarize(Media_idade = mean(idade))
## # A tibble: 3 × 2
## classificacao Media_idade
## <chr> <dbl>
## 1 magreza 31
## 2 normal 40
## 3 obesidade 1 28.5
#Contagem
data_2 %>%
group_by(classificacao) %>%
summarize(individuos = n())
## # A tibble: 3 × 2
## classificacao individuos
## <chr> <int>
## 1 magreza 1
## 2 normal 2
## 3 obesidade 1 2
arrange(): Ordenando dadosPodemos ordenar os dados de forma crescente e decrescente usando o
arrange().
# Ordenando dados de forma crescente
data_2 %>%
arrange(idade)
## nome altura idade peso imc classificacao
## 1 Júlia 1.60 25 80 31.25000 obesidade 1
## 2 Gabriela 1.59 30 50 19.77770 normal
## 3 Beatriz 1.78 31 40 12.62467 magreza
## 4 Luiza 1.73 32 100 33.41241 obesidade 1
## 5 Rafaela 1.85 50 70 20.45289 normal
# Ordenando de forma decrescente
#Método 1
data_2 %>%
arrange(desc(idade))
## nome altura idade peso imc classificacao
## 1 Rafaela 1.85 50 70 20.45289 normal
## 2 Luiza 1.73 32 100 33.41241 obesidade 1
## 3 Beatriz 1.78 31 40 12.62467 magreza
## 4 Gabriela 1.59 30 50 19.77770 normal
## 5 Júlia 1.60 25 80 31.25000 obesidade 1
#Método 2
data_2 %>%
arrange(-idade)
## nome altura idade peso imc classificacao
## 1 Rafaela 1.85 50 70 20.45289 normal
## 2 Luiza 1.73 32 100 33.41241 obesidade 1
## 3 Beatriz 1.78 31 40 12.62467 magreza
## 4 Gabriela 1.59 30 50 19.77770 normal
## 5 Júlia 1.60 25 80 31.25000 obesidade 1
pipe para fazer múltiplas operações de uma
vezUsando o pipe, podemos escrever e ler códigos em uma sequência lógica fácil.
Por exemplo, abaixo:
- pegamos a tabela
data_2, ordenamos a altura na ordem crescente,- filtramos somente as pessoas com idade acima de 30 e peso acima de 50 e retiramos os nomes.
- Depois, arredondamos os valores do IMC para uma casa decimal (usando
round())e criamos uma nova variável chamadapeso_x_idade.- Por fim, resumimos os dados usando a média do peso e a média do imc, e criamos uma variável chamada
mega_pipe
# Múltiplas operações em uma caixa
mega_pipe = data_2 %>%
arrange(altura) %>%
filter(idade >= 30,
peso >= 50) %>%
select(-nome) %>%
mutate(imc = round(imc, 1),
peso_x_idade = peso * idade) %>%
summarise(mean_peso = mean(peso),
mean_peso = round(mean_peso, 1),
mean_imc = mean(imc) %>% round(1))
mega_pipe
## mean_peso mean_imc
## 1 73.3 24.6
Podemos importar tabelas de forma manual, clicando no nome do arquivo
no quadrante onde encontramos a aba “Files” e selecionando “Import
dataset”, que é realizado pelo pacote readr.
Caso queira deixar automatizado, você pode copiar o código que é gerado e colar no seu bloco de código aqui.
A função read_csv() acessa o local do seu arquivo (no
caso, do tipo .csv) e o importa para o ambiente do R. Existem funções
para importar cada tipo de arquivo, como excel, tsv, etc.
#Pelo readr
cobertura_vacinal <- read_csv("cobertura_vacinal_anotada.csv")
## New names:
## Rows: 103066 Columns: 11
## ── Column specification
## ──────────────────────────────────────────────────────── Delimiter: "," chr
## (8): name, country_abrev, vaccine, region, type, diseases, region_comple... dbl
## (3): ...1, year, coverage
## ℹ Use `spec()` to retrieve the full column specification for this data. ℹ
## Specify the column types or set `show_col_types = FALSE` to quiet this message.
## • `` -> `...1`
cobertura_vacinal
## # A tibble: 103,066 × 11
## ...1 name country_abrev year vaccine coverage region type diseases
## <dbl> <chr> <chr> <dbl> <chr> <dbl> <chr> <chr> <chr>
## 1 1 Afghanistan AFG 2022 BCG 88 ROSA count… Tubercu…
## 2 2 Afghanistan AFG 2021 BCG 84 ROSA count… Tubercu…
## 3 3 Afghanistan AFG 2020 BCG 87 ROSA count… Tubercu…
## 4 4 Afghanistan AFG 2019 BCG 86 ROSA count… Tubercu…
## 5 5 Afghanistan AFG 2018 BCG 89 ROSA count… Tubercu…
## 6 6 Afghanistan AFG 2017 BCG 84 ROSA count… Tubercu…
## 7 7 Afghanistan AFG 2016 BCG 78 ROSA count… Tubercu…
## 8 8 Afghanistan AFG 2015 BCG 76 ROSA count… Tubercu…
## 9 9 Afghanistan AFG 2014 BCG 74 ROSA count… Tubercu…
## 10 10 Afghanistan AFG 2013 BCG 72 ROSA count… Tubercu…
## # ℹ 103,056 more rows
## # ℹ 2 more variables: region_complete <chr>, continent <chr>
#Tabela de mortes por doença
mortes_doencas <- read_rds("Deaths_infectious_diseases_filtered.rds")
mortes_doencas
## # A tibble: 43,076 × 9
## name year total_deaths perc_deaths death_rate_100thousand
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 Albania 1987 69 0.398 2.24
## 2 Albania 1988 58 0.336 1.85
## 3 Albania 1989 50 0.275 1.57
## 4 Albania 1992 24 0.139 0.752
## 5 Albania 1993 27 0.162 0.852
## 6 Albania 1994 19 0.127 0.593
## 7 Albania 1995 17 0.106 0.523
## 8 Albania 1996 6 0.0358 0.183
## 9 Albania 1997 13 0.0803 0.391
## 10 Albania 1998 5 0.0303 0.149
## # ℹ 43,066 more rows
## # ℹ 4 more variables: death_rate_100thousand_age_standardized <dbl>,
## # death_disease <chr>, continent <chr>, region_complete <chr>
Para trabalharmos de forma fácil com uma tabela, precisamos padronizá-la.
Isso significa que trocaremos e reordenaremos os nomes das colunas para fazerem mais sentido, completaremos os valores NA quando for possível (e fizer sentido), e explicitaremos algumas coisas, como o nome das doenças contra as quais as vacinas protegem, e daremos o nome completo de cada região, pois somente temos os códigos delas.
#Organizar colunas
cobertura_vacinal = cobertura_vacinal %>%
select(-"...1", type, name, country_abrev, continent, region, region_complete, year, everything())
#Salvar
cobertura_vacinal %>%
saveRDS(file = "cobertura_vacinal_anotada_2.rds")
#Organizar colunas
mortes_doencas = mortes_doencas %>%
select(name, continent,region_complete, everything())
#Salvar
mortes_doencas %>%
saveRDS(file = "mortes_doencas.rds")
mortes_doencas
## # A tibble: 43,076 × 9
## name continent region_complete year total_deaths perc_deaths
## <chr> <chr> <chr> <dbl> <dbl> <dbl>
## 1 Albania Europe Europe and Central Asia 1987 69 0.398
## 2 Albania Europe Europe and Central Asia 1988 58 0.336
## 3 Albania Europe Europe and Central Asia 1989 50 0.275
## 4 Albania Europe Europe and Central Asia 1992 24 0.139
## 5 Albania Europe Europe and Central Asia 1993 27 0.162
## 6 Albania Europe Europe and Central Asia 1994 19 0.127
## 7 Albania Europe Europe and Central Asia 1995 17 0.106
## 8 Albania Europe Europe and Central Asia 1996 6 0.0358
## 9 Albania Europe Europe and Central Asia 1997 13 0.0803
## 10 Albania Europe Europe and Central Asia 1998 5 0.0303
## # ℹ 43,066 more rows
## # ℹ 3 more variables: death_rate_100thousand <dbl>,
## # death_rate_100thousand_age_standardized <dbl>, death_disease <chr>
# Explorando dados -----
# Tabela completa
view(cobertura_vacinal)
# Descrição geral
glimpse(cobertura_vacinal)
## Rows: 103,066
## Columns: 11
## $ name <chr> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanis…
## $ country_abrev <chr> "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG"…
## $ year <dbl> 2022, 2021, 2020, 2019, 2018, 2017, 2016, 2015, 2014, …
## $ vaccine <chr> "BCG", "BCG", "BCG", "BCG", "BCG", "BCG", "BCG", "BCG"…
## $ coverage <dbl> 88, 84, 87, 86, 89, 84, 78, 76, 74, 72, 78, 71, 68, 64…
## $ region <chr> "ROSA", "ROSA", "ROSA", "ROSA", "ROSA", "ROSA", "ROSA"…
## $ type <chr> "country", "country", "country", "country", "country",…
## $ diseases <chr> "Tuberculosis", "Tuberculosis", "Tuberculosis", "Tuber…
## $ region_complete <chr> "South Asia", "South Asia", "South Asia", "South Asia"…
## $ continent <chr> "Asia", "Asia", "Asia", "Asia", "Asia", "Asia", "Asia"…
## $ ...1 <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,…
# Primeiras 10 linhas
head(cobertura_vacinal, 10)
## # A tibble: 10 × 11
## name country_abrev year vaccine coverage region type diseases
## <chr> <chr> <dbl> <chr> <dbl> <chr> <chr> <chr>
## 1 Afghanistan AFG 2022 BCG 88 ROSA country Tuberculosis
## 2 Afghanistan AFG 2021 BCG 84 ROSA country Tuberculosis
## 3 Afghanistan AFG 2020 BCG 87 ROSA country Tuberculosis
## 4 Afghanistan AFG 2019 BCG 86 ROSA country Tuberculosis
## 5 Afghanistan AFG 2018 BCG 89 ROSA country Tuberculosis
## 6 Afghanistan AFG 2017 BCG 84 ROSA country Tuberculosis
## 7 Afghanistan AFG 2016 BCG 78 ROSA country Tuberculosis
## 8 Afghanistan AFG 2015 BCG 76 ROSA country Tuberculosis
## 9 Afghanistan AFG 2014 BCG 74 ROSA country Tuberculosis
## 10 Afghanistan AFG 2013 BCG 72 ROSA country Tuberculosis
## # ℹ 3 more variables: region_complete <chr>, continent <chr>, ...1 <dbl>
# Últimas 10 linhas
tail(cobertura_vacinal, 10)
## # A tibble: 10 × 11
## name country_abrev year vaccine coverage region type diseases
## <chr> <chr> <dbl> <chr> <dbl> <chr> <chr> <chr>
## 1 WCAR WCAR 2022 HEPBB 28 WCAR region Hepatitis B
## 2 WCAR WCAR 2022 HIB3 69 WCAR region Haemophilus influen…
## 3 WCAR WCAR 2022 IPV1 70 WCAR region Poliomielitis
## 4 WCAR WCAR 2022 MCV1 64 WCAR region Measles
## 5 WCAR WCAR 2022 MCV2 32 WCAR region Measles
## 6 WCAR WCAR 2022 PCV3 64 WCAR region Pneumococcus
## 7 WCAR WCAR 2022 POL3 68 WCAR region Poliomielitis
## 8 WCAR WCAR 2022 RCV1 20 WCAR region Rotavirus
## 9 WCAR WCAR 2022 ROTAC 44 WCAR region Rotavirus
## 10 WCAR WCAR 2022 YFV 62 WCAR region Yellow fever
## # ℹ 3 more variables: region_complete <chr>, continent <chr>, ...1 <dbl>
#Summary statistics
summary(cobertura_vacinal)
## name country_abrev year vaccine
## Length:103066 Length:103066 Min. :1980 Length:103066
## Class :character Class :character 1st Qu.:1990 Class :character
## Mode :character Mode :character Median :2001 Mode :character
## Mean :2001
## 3rd Qu.:2012
## Max. :2022
##
## coverage region type diseases
## Min. : 0.00 Length:103066 Length:103066 Length:103066
## 1st Qu.:75.00 Class :character Class :character Class :character
## Median :90.00 Mode :character Mode :character Mode :character
## Mean :81.46
## 3rd Qu.:97.00
## Max. :99.00
## NA's :39349
## region_complete continent ...1
## Length:103066 Length:103066 Min. : 1
## Class :character Class :character 1st Qu.: 25767
## Mode :character Mode :character Median : 51534
## Mean : 51534
## 3rd Qu.: 77300
## Max. :103066
##
Cada coluna contendo strings repetidas nas linhas podem ser reduzidas aos valores únicos.
Por exemplo, veja que as regiões, por estarem na tabela longa, são
repetidas para cada país. Se quisermos saber todas as regiões incluídas
no dataset de forma mais fácil, sem ficar procurando uma por uma, usamos
o unique().
#Níveis de colunas
unique(cobertura_vacinal$region_complete)
## [1] "South Asia" "Europe and Central Asia"
## [3] "Middle East and North Africa" "Eastern and Southern Africa"
## [5] "Latin America and Caribbean" "Non-programme"
## [7] "West and Central Africa" "East Asia and Pacific"
## [9] "Global"
unique(cobertura_vacinal$continent)
## [1] "Asia" "Europe" "Africa" "Americas"
## [5] "Other" "Oceania" "Global" "EAPR"
## [9] "ECAR" "ESAR" "LACR" "MENA"
## [13] "Non-programme" "ROSA" "WCAR"
unique(cobertura_vacinal$name) %>%
head(10)
## [1] "Afghanistan" "Albania" "Algeria" "Angola" "Argentina"
## [6] "Armenia" "Austria" "Azerbaijan" "Bangladesh" "Belarus"
unique(cobertura_vacinal$vaccine) %>%
head(10)
## [1] "BCG" "DTP1" "DTP3" "HEPB3" "HEPBB" "HIB3" "IPV1" "MCV1" "MCV2"
## [10] "PCV3"
E se quisermos contar quantas vezes esses valores são repetidos no
dataset? Podemos usar o count() seguido por
head(), para visualizar os 10 primeiros valores. O
head() é importante quando temos uma tabela muito grande e
não queremos ver todos os valores.
#Contar linhas por coluna
cobertura_vacinal %>%
count(name) %>%
head(10)
## # A tibble: 10 × 2
## name n
## <chr> <int>
## 1 Afghanistan 516
## 2 Albania 559
## 3 Algeria 516
## 4 Andorra 473
## 5 Angola 559
## 6 Antigua and Barbuda 430
## 7 Argentina 602
## 8 Armenia 559
## 9 Australia 473
## 10 Austria 473
cobertura_vacinal %>%
count(vaccine) %>%
head(10)
## # A tibble: 10 × 2
## vaccine n
## <chr> <int>
## 1 BCG 7611
## 2 DTP1 8772
## 3 DTP3 8772
## 4 HEPB3 8555
## 5 HEPBB 4808
## 6 HIB3 8639
## 7 IPV1 8457
## 8 MCV1 8772
## 9 MCV2 8248
## 10 PCV3 6800
cobertura_vacinal %>%
count(region_complete) %>%
head(10)
## # A tibble: 9 × 2
## region_complete n
## <chr> <int>
## 1 East Asia and Pacific 15551
## 2 Eastern and Southern Africa 12008
## 3 Europe and Central Asia 11337
## 4 Global 441
## 5 Latin America and Caribbean 17727
## 6 Middle East and North Africa 10761
## 7 Non-programme 17916
## 8 South Asia 4371
## 9 West and Central Africa 12954
Temos também uma forma de contar a frequência dessas linhas. Veja que
há uma diferença nas observações/linhas por região, sendo a região da
américa latina a que mais contém observações, e a região do sul-asiático
a que tem menos. No caso de “Global”, esses dados se
referem à cobertura vacinal do conjunto de todos os países para cada
vacina, e por isso tem n = 441.
#Tabela de frequências
cobertura_vacinal %>%
tabyl(region_complete) %>%
head(10)
## region_complete n percent
## East Asia and Pacific 15551 0.150883900
## Eastern and Southern Africa 12008 0.116507869
## Europe and Central Asia 11337 0.109997477
## Global 441 0.004278812
## Latin America and Caribbean 17727 0.171996585
## Middle East and North Africa 10761 0.104408825
## Non-programme 17916 0.173830361
## South Asia 4371 0.042409718
## West and Central Africa 12954 0.125686453
Valores NA (Not Available) podem surgir por
diversos motivos, como erros de coleta de dados, falhas em dispositivos
de medição, ou simplesmente porque a informação não está disponível.
Use a função skim() e faça um diagnóstico da tabela.
Existem dados faltantes? Por que existem e onde estão?
# Dados faltantes ----
skim(cobertura_vacinal)
| Name | cobertura_vacinal |
| Number of rows | 103066 |
| Number of columns | 11 |
| _______________________ | |
| Column type frequency: | |
| character | 8 |
| numeric | 3 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| name | 0 | 1 | 4 | 37 | 0 | 204 | 0 |
| country_abrev | 0 | 1 | 3 | 13 | 0 | 204 | 0 |
| vaccine | 0 | 1 | 3 | 5 | 0 | 14 | 0 |
| region | 0 | 1 | 4 | 13 | 0 | 9 | 0 |
| type | 0 | 1 | 6 | 7 | 0 | 2 | 0 |
| diseases | 0 | 1 | 4 | 28 | 0 | 10 | 0 |
| region_complete | 0 | 1 | 6 | 28 | 0 | 9 | 0 |
| continent | 0 | 1 | 4 | 13 | 0 | 15 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| year | 0 | 1.00 | 2001.12 | 12.41 | 1980 | 1990.00 | 2001.0 | 2012.00 | 2022 | ▇▇▇▇▇ |
| coverage | 39349 | 0.62 | 81.46 | 22.10 | 0 | 75.00 | 90.0 | 97.00 | 99 | ▁▁▁▂▇ |
| …1 | 0 | 1.00 | 51533.50 | 29752.74 | 1 | 25767.25 | 51533.5 | 77299.75 | 103066 | ▇▇▇▇▇ |
# Como são essas linhas?
cobertura_vacinal %>%
filter(!complete.cases(.)) %>%
head(10)
## # A tibble: 10 × 11
## name country_abrev year vaccine coverage region type diseases
## <chr> <chr> <dbl> <chr> <dbl> <chr> <chr> <chr>
## 1 Afghanistan AFG 1981 BCG NA ROSA country Tuberculosis
## 2 Afghanistan AFG 1980 BCG NA ROSA country Tuberculosis
## 3 Algeria DZA 1984 BCG NA MENA country Tuberculosis
## 4 Algeria DZA 1983 BCG NA MENA country Tuberculosis
## 5 Algeria DZA 1982 BCG NA MENA country Tuberculosis
## 6 Algeria DZA 1981 BCG NA MENA country Tuberculosis
## 7 Algeria DZA 1980 BCG NA MENA country Tuberculosis
## 8 Angola AGO 1982 BCG NA ESAR country Tuberculosis
## 9 Angola AGO 1981 BCG NA ESAR country Tuberculosis
## 10 Angola AGO 1980 BCG NA ESAR country Tuberculosis
## # ℹ 3 more variables: region_complete <chr>, continent <chr>, ...1 <dbl>
Observe que somente há dados faltantes na coluna coverage. Isso acontece porque, apesar de uma vacina ter sido incorporada a programas de vacinação nacionais, isso não ocorreu ao mesmo tempo com todos os países. Dessa forma, podemos excluir essas linhas, mas não substituir os NAs por 0, porque isso significaria que a vacina estava disponível e ninguém foi vacinado.
Abaixo, queremos obter o resumo dos dados de cada país na região da
América latina. Como a tabela tem linhas com dados faltantes, algumas
operações podem confundir os resultados. Por isso, usamos a função
drop_na().
Além disso, queremos filtrar somente os dados dos países
latinoamericanos entre os anos 2000 e 2023. Para isso, usamos o
between() dentro da função filter(), e especificamos que
queremos o type == "country", pois também temos dados da
região como um todo.
Como não queremos trabalhar com os nomes completos das regiões,
podemos ser menos específicos. Por exemplo, se sabemos que existe a
região “Latin America and Caribbean Region (LACR)”, podemos somente usar
uma função que pega um pedaço do nome completo e nos retorna aquela
linha. Isso é feito com o str_detect().
Para calcularmos as estatísticas gerais com summarize, precisamos
agrupar os dados com group_by(). Isso porque temos dados da
cobertura vacinal por país em 23 anos e para mais de uma vacina. Dessa
forma, agruparemos por país (name) e vacina
(vaccine). Ao final, vamos desagrupar esses dados.
As tabelas produzidas a seguir serão utilizadas para trabalharmos a visualização dos dados!
Por país
Veja quais são os países da américa latina que mais vacinaram ao longo de 2000 a 2023, por vacina.
latin_2000_2023 = cobertura_vacinal %>%
#Missing values: Aqui, é importante retirá-los para não repetir linhas
drop_na(coverage) %>%
#Filtrando os dados no intervalo e
filter(between(year, 2000, 2022),
str_detect(region_complete, "Latin"),
type == "country") %>%
#Agrupar por vacina e país
group_by(vaccine, name) %>%
#Resumir estatísticas
# Estatísticas da cobertura vacinal para cada país em um continente
# Média, mediana, mínimo e máximo de uma variável numérica
summarise(
mean = mean(coverage),
median = median(coverage),
max = max(coverage),
min = min(coverage),
sd = sd(coverage),
var = var(coverage)
) %>%
#Ordenar continentes pela mediana de forma decrescente
arrange(vaccine, desc(mean)) %>%
#Desagrupar
ungroup()
## `summarise()` has grouped output by 'vaccine'. You can override using the
## `.groups` argument.
latin_2000_2023
## # A tibble: 402 × 8
## vaccine name mean median max min sd var
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 BCG Cuba 99 99 99 99 0 0
## 2 BCG Uruguay 98.7 99 99 97 0.559 0.312
## 3 BCG Panama 98.6 99 99 95 0.941 0.885
## 4 BCG Dominica 97.2 98 99 89 2.81 7.88
## 5 BCG Dominican Republic 96.5 98 99 85 3.65 13.4
## 6 BCG Guyana 96.2 97 99 90 2.56 6.54
## 7 BCG Saint Kitts and Nevis 96.2 97 99 89 2.84 8.09
## 8 BCG Chile 96.1 96 99 91 2.28 5.21
## 9 BCG Nicaragua 96 99 99 86 4.35 18.9
## 10 BCG Belize 95.5 98 99 76 5.55 30.8
## # ℹ 392 more rows
Por continente
Veja quais são os continentes que mais vacinaram ao longo de 2000 a 2023, por vacina.
Algumas modificações foram feitas na tabela original. Observe que os
valores para “Other” incluem países que
não foram identificados corretamente, sendo o motivo principal o nome
utilizado e processos históricos, como divisão do país e mudança de
nome. Como esses países podem ser interessantes para as análises
posteriores, eles continuaram na tabela.
# Cobertura vacinal: Estatísticas de cada continente
continentes_vac = cobertura_vacinal %>%
drop_na(coverage,
continent) %>%
filter(between(year, 2000, 2023),
type == "country") %>%
group_by(vaccine, continent) %>%
summarise(
mean = mean(coverage),
median = median(coverage),
max = max(coverage),
min = min(coverage),
sd = sd(coverage),
var = var(coverage)
) %>%
#Ordenar continentes pela mediana de forma decrescente
arrange(vaccine, desc(mean)) %>%
ungroup()
## `summarise()` has grouped output by 'vaccine'. You can override using the
## `.groups` argument.
#Visualizar
continentes_vac
## # A tibble: 79 × 8
## vaccine continent mean median max min sd var
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 BCG Americas 93.6 96 99 28 7.36 54.2
## 2 BCG Other 92.3 96 99 0 10.4 109.
## 3 BCG Asia 91.7 96 99 29 10.8 117.
## 4 BCG Europe 86.7 97 99 16 23.6 557.
## 5 BCG Africa 85.4 90 99 26 14.5 211.
## 6 DTP1 Europe 97.2 98 99 84 2.34 5.47
## 7 DTP1 Oceania 94.8 95 98 90 2.50 6.25
## 8 DTP1 Americas 94.3 96 99 73 5.50 30.2
## 9 DTP1 Other 93.5 98 99 39 9.46 89.4
## 10 DTP1 Asia 92.4 96 99 45 8.95 80.0
## # ℹ 69 more rows
Por continente
# Mortes cumulativas
# Estatísticas de cada continente
continentes_mortes = mortes_doencas %>%
drop_na(total_deaths,
continent) %>%
filter(between(year, 2000, 2023)) %>%
group_by(death_disease, continent) %>%
summarise(
cumulativo = sum(total_deaths),
mean = mean(total_deaths),
median = median(total_deaths),
max = max(total_deaths),
min = min(total_deaths),
sd = sd(total_deaths),
var = var(total_deaths)
) %>%
#Aqui, queremos os países com maior número de mortes
arrange(death_disease, - cumulativo) %>%
ungroup()
## `summarise()` has grouped output by 'death_disease'. You can override using the
## `.groups` argument.
continentes_mortes
## # A tibble: 54 × 9
## death_disease continent cumulativo mean median max min sd var
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Diphteria Asia 516 2.53e+0 0 31 0 6.33e+0 4.00e+1
## 2 Diphteria Other 428 5.95e-1 0 56 0 3.81e+0 1.45e+1
## 3 Diphteria Americas 166 4.32e-1 0 11 0 1.47e+0 2.17e+0
## 4 Diphteria Europe 39 7.78e-2 0 3 0 3.46e-1 1.20e-1
## 5 Diphteria Africa 27 4.35e-1 0 3 0 7.81e-1 6.11e-1
## 6 Diphteria Oceania 4 1.03e-1 0 1 0 3.07e-1 9.45e-2
## 7 Hepatitis B Africa 107959 1.74e+3 264. 7771 0 2.63e+3 6.92e+6
## 8 Hepatitis B Other 57779 8.02e+1 4 2262 0 2.61e+2 6.81e+4
## 9 Hepatitis B Asia 44701 2.19e+2 21 1352 0 3.41e+2 1.16e+5
## 10 Hepatitis B Americas 36628 9.54e+1 27 942 0 1.93e+2 3.73e+4
## # ℹ 44 more rows
Por país
# Mortes cumulativas
# Estatísticas de cada país
paises_mortes = mortes_doencas %>%
drop_na(total_deaths,
name) %>%
filter(between(year, 2000, 2023)) %>%
group_by(death_disease, name) %>%
summarise(
cumulativo = sum(total_deaths),
mean = mean(total_deaths),
median = median(total_deaths),
max = max(total_deaths),
min = min(total_deaths),
sd = sd(total_deaths),
var = var(total_deaths)
) %>%
arrange(death_disease, desc(cumulativo)) %>%
ungroup()
## `summarise()` has grouped output by 'death_disease'. You can override using the
## `.groups` argument.
paises_mortes
## # A tibble: 1,062 × 9
## death_disease name cumulativo mean median max min sd var
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Diphteria Philippines 325 21.7 23 31 7 6.49 42.1
## 2 Diphteria Russian Fed… 253 12.6 1 56 0 18.1 327.
## 3 Diphteria Thailand 121 6.37 6 13 2 3.00 9.02
## 4 Diphteria Brazil 84 4 4 11 0 3.11 9.7
## 5 Diphteria Iraq 47 15.7 13 23 11 6.43 41.3
## 6 Diphteria Latvia 43 1.95 1 11 0 2.97 8.81
## 7 Diphteria Dominican R… 38 2 1 9 0 2.71 7.33
## 8 Diphteria Syrian Arab… 29 2.64 3 5 0 1.69 2.85
## 9 Diphteria Venezuela (… 24 1.41 0 24 0 5.82 33.9
## 10 Diphteria South Africa 23 1.21 1 3 0 0.976 0.953
## # ℹ 1,052 more rows
A visualização com o ggplot2 é feito em
camadas. Primeiro, temos um dataframe com os dados de
interesse, depois chamamos a função ggplot() e adicionamos
um +, que funciona aqui como um pipe, mas somente para
gráficos. A partir disso, temos de mapear os eixos, cores, tamanho, etc.
com as variáveis de interesse, usando o aes(). Para definir
qual tipo de gráfico iremos criar, temos de definir a geometria
(geom_), que no caso é de pontos
(geom_point()). Isso já produz um gráfico, mas não é um dos
melhores.
Para melhorar, podemos adicionar mais funções, como labels para os
pontos do gráfico (geom_label()), um tema pré-definido
(theme_light()) ou customizável (theme()), e
título para o gráfico, eixos, e legendas (labs()). Além
disso, para reordenar os valores de uma variável categórica, como os
países, por uma variável numérica, usamos o fct_reorder()
dentro do mutate().
Por continente
#Gráfico de pontos simples
continentes_pontos_vac = continentes_vac %>% #Dataframe
filter(vaccine %in% "MCV1") %>%
mutate(continent = fct_reorder(continent, median)) %>%
#Chamando a função. Aqui se usa "+" em vez de "%>%"
ggplot() +
#Mapeando os eixos
aes(x = median,
y = continent,
color = continent) +
#Geometrias
geom_point() +
#Labels nos pontos
geom_label(aes(x = median,
y = continent,
label = median)) +
#Tema
theme_light() +
#Títulos
labs(title = "Cobertura vacinal",
x = "Mediana (Cobertura vacinal %)",
y = "Continentes")
continentes_pontos_vac
Por país
#Gráfico de pontos simples
pontos = latin_2000_2023 %>% #Dataframe
filter(vaccine %in% "MCV1") %>%
mutate(name = fct_reorder(name, median)) %>%
ggplot() + #Chamando a função. Aqui se usa "+" em vez de "%>%"
#Mapeando os eixos
aes(x = median,
y = name,
color = median) +
#Geometrias
geom_point() +
geom_text(aes(x = median, #Use geom_label para visualizar melhor
y = name,
label = median),
hjust = -0.5) +
#Tema
theme_light() +
#Labels
labs(title = "Cobertura vacinal",
x = "Mediana (Cobertura vacinal%)",
y = "Países") +
#Limites
xlim(60, 105)
pontos
Por continente
#Gráfico de barras simples
continente_barras_vac = continentes_vac %>% #Dataframe
filter(vaccine %in% "MCV1") %>%
mutate(continent = fct_reorder(continent, median)) %>%
ggplot() + #Chamando a função. Aqui se usa "+" em vez de "%>%"
#Mapeando os eixos
aes(x = median,
y = continent,
fill = continent) +
#Geometrias
geom_col() +
geom_text(aes(x = median,
y = continent,
label = median),
hjust = -0.5) +
#Tema
theme_light() +
#Labels
labs(title = "Cobertura vacinal",
x = "Mediana (Cobertura vacinal %)",
y = "Continentes") +
#Limites
xlim(0, 105)
continente_barras_vac
Por país
#Gráfico de barras simples
pais_barras_vac = latin_2000_2023 %>% #Dataframe
filter(vaccine %in% "MCV1") %>%
mutate(name = fct_reorder(name, median)) %>%
ggplot() + #Chamando a função. Aqui se usa "+" em vez de "%>%"
#Mapeando os eixos
aes(x = median,
y = name,
fill = median) +
#Geometrias
geom_col() +
geom_text(aes(x = median,
y = name,
label = median),
hjust = -0.5) +
#Tema
theme_light() +
#Labels
labs(title = "Países com cobertura vacinal para sarampo, entre 2000 e 2023",
x = "Mediana (Cobertura vacinal%)",
y = "Países") +
xlim(0, 105)
pais_barras_vac
Por continente
#Gráfico de pontos simples
barras_mortes = continentes_mortes %>% #Dataframe
filter(death_disease == "Measles") %>%
mutate(continent = fct_reorder(continent, cumulativo)) %>%
ggplot() + #Chamando a função. Aqui se usa "+" em vez de "%>%"
#Mapeando os eixos
aes(x = cumulativo,
y = continent,
fill = continent) +
#Geometrias
geom_col() +
geom_label(aes(x = cumulativo,
y = continent,
label = cumulativo),
hjust = -0.2) +
#Tema
theme_light() +
#Labels
labs(title = "Mortes cumulativas por Sarampo, de 2000 a 2023",
x = "Mortes",
y = "Continentes") +
#Eixo x
xlim(0, 10000) #Aumentar limites
barras_mortes
De acordo com o gráfico, o continente asiático contribuiu para 84% das mortes por sarampo, em 23 anos. Mas, a doença foi endêmica no continente todo ou somente em alguns países?
#Gráfico de barras simples
paises_barras_mortes = paises_mortes %>% #Dataframe
filter(death_disease == "Measles") %>%
mutate(name = fct_reorder(name, cumulativo)) %>%
slice_max(order_by = cumulativo, n = 10) %>%
ggplot() + #Chamando a função. Aqui se usa "+" em vez de "%>%"
#Mapeando os eixos
aes(x = cumulativo,
y = name,
fill = name) +
#Geometrias
geom_col() +
geom_label(aes(x = cumulativo,
y = name,
label = cumulativo),
hjust = -0.2) +
#Tema
theme_light() +
#Labels
labs(title = "Mortes cumulativas por Sarampo, de 2000 a 2023",
x = "Mortes",
y = "Países") +
#Eixo x
xlim(0, 10000) #Aumentar limites
paises_barras_mortes
As Filipinas foi o país que mais contribuiu para 80% das mortes no mundo todo. Na Ásia, o Japão, Mongólia e Tailândia também registraram muitas mortes pela doença, o que poderia indicar que a doença se espalhou entre esses países ou isso ocorreu em tempos diferentes. Interessante, não? Para explorar mais, considere os gráficos que faremos a seguir com outros exemplos.
O pacote esquisse é uma ferramenta
interativa para a construção de gráficos, de forma rápida e
intuitiva.
Lembre-se de retirar os # antes de rodar. Teste todos os
parâmetros e veja como os dados se comportam nos diferentes tipos de
gráficos. Observe também, no botão do lado inferior direito, que você
pode gerar os códigos do gráfico também. Dessa forma, você automatiza
seu gráfico sem precisar ficar abrindo esta janela sempre!
#Visualização rápida
# latin_2000_2023 %>%
# esquisser()
Chegamos a um gráfico interessante. Por isso, copiamos e colamos o código aqui, para permitir que façamos outras modificações no gráfico.
Nele, queremos filtrar a cobertura vacinal contra o sarampo nos
países da américa latina e identificar aqueles países que apresentem
cobertura vacinal maior ou igual a 95%. Caso o país tenha cobertura
menor, ele será marcado de vermelho. Para isso, usamos o
gghighlight()
# Melhorando o gráfico -----
plot =
# Manipular tabela
latin_2000_2023 %>%
filter(vaccine %in% "MCV1") %>%
mutate(name = fct_reorder(name, median)) %>%
#Criar base do gráfico
ggplot() +
aes(x = median, y = name, colour = median) + #Aesthetics (mapping)
#Geometria
geom_point(shape = "circle",
size = 1) +
#Highlight (add sempre após geom_)
gghighlight(median >= 95, #Filtragem
label_key = name, #Nome do label
label_params = list(size = 3), #Tamanho da fonte
unhighlighted_params = list(colour = "red")) +
#Marcações
#Add Linha vertical
geom_vline(xintercept = 95,
colour = "black",
size =0.2,
linetype = 2) +
#Tema, aparência
theme_light() +
# Labels, titulo, subtitulo, titulo dos eixos
labs(title = "Vacinação em países da América Latina",
subtitle = "Sarampo, MCV1, Dose 1, entre 2000 e 2023",
y = "Países",
x = "Mediana (Cobertura %)",
tag = "Figure A.",
colour = "Cobertura vacinal",
caption = "Fonte: Feito pela UPVacina") +
# Aparência especifica
theme(
#Texto geral
text = element_text(family = "sans", #sans, mono, serif
color = "black"),
#Título, subtítulo e tag
plot.title = element_text(size = 12,
face = "bold",
hjust = 0,
vjust = 0.5),
plot.subtitle = element_text(size = 10),
plot.tag.position = "topleft",
plot.tag = element_text(vjust = 5,
size = 12,
face = "bold"),
#Legenda
legend.title = element_text(face = "bold"),
legend.text = element_text(size = 10),
#Eixos
axis.title.x = element_text(size = 10,
angle = 0,
color = "black"),
axis.text.x = element_text(color = "black",
size = 8,
angle = 0),
axis.text.y = element_text(size = 8,
color = "black"),
#Margens do gráfico
plot.margin = unit(c(0.5, #Top
1, #Right
0.5, #Bottom
0), #Left
"cm") #Unidade)
)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
#Visualizar
plot
#Salvar
ggsave(plot, file = "Sarampo_LatinAmerica_2000_2023.png", width = 10, height = 5)
plot %>%
ggplotly()
## Warning in geom2trace.default(dots[[1L]][[5L]], dots[[2L]][[1L]], dots[[3L]][[1L]]): geom_GeomLabelRepel() has yet to be implemented in plotly.
## If you'd like to see this geom implemented,
## Please open an issue with your example code at
## https://github.com/ropensci/plotly/issues
## Warning in geom2trace.default(dots[[1L]][[5L]], dots[[2L]][[1L]], dots[[3L]][[1L]]): geom_GeomLabelRepel() has yet to be implemented in plotly.
## If you'd like to see this geom implemented,
## Please open an issue with your example code at
## https://github.com/ropensci/plotly/issues
## Warning in geom2trace.default(dots[[1L]][[5L]], dots[[2L]][[1L]], dots[[3L]][[1L]]): geom_GeomLabelRepel() has yet to be implemented in plotly.
## If you'd like to see this geom implemented,
## Please open an issue with your example code at
## https://github.com/ropensci/plotly/issues
## Warning in geom2trace.default(dots[[1L]][[5L]], dots[[2L]][[1L]], dots[[3L]][[1L]]): geom_GeomLabelRepel() has yet to be implemented in plotly.
## If you'd like to see this geom implemented,
## Please open an issue with your example code at
## https://github.com/ropensci/plotly/issues
## Warning in geom2trace.default(dots[[1L]][[5L]], dots[[2L]][[1L]], dots[[3L]][[1L]]): geom_GeomLabelRepel() has yet to be implemented in plotly.
## If you'd like to see this geom implemented,
## Please open an issue with your example code at
## https://github.com/ropensci/plotly/issues
#Unindo gráficos -----
vaccination = cobertura_vacinal %>%
filter(name == "Brazil",
vaccine == "MCV1") %>%
ggplot() +
geom_line(mapping = aes(
x = year,
y = coverage),
colour = "#4DBBD5B2",
linewidth = 2) +
geom_text(aes(x = year,
y = coverage,
label = coverage),
vjust = -0.5,
size = 2) +
theme_minimal() +
labs(title = "Cobertura vacinal contra o sarampo, Brasil",
x = "Ano",
y = "Cobertura vacinal (%)") +
ylim(0, 110)
vaccination
#Mortes
deaths = mortes_doencas %>%
filter(name == "Brazil",
death_disease == "Measles") %>%
ggplot() +
aes(x = year, y = total_deaths) +
geom_col(fill = "#DC0000B2") +
geom_text(aes(label = total_deaths),
vjust = -0.5,
size = 2) +
theme_minimal() +
theme(text = element_text(size = 10)) +
labs(title = "Mortes por sarampo, Brasil",
x = "Ano",
y = "Mortes") +
ylim(0, 3400)
deaths
#Unir gráficos
(vaccination / deaths)
(vaccination + deaths)
#Salvar
(vaccination / deaths) %>%
ggsave(file = "Sarampo_Brasil_1980_2023.png", width = 10, height = 5)
#Boxplot simples por ano
boxplot_years = cobertura_vacinal %>%
filter(type == "country",
vaccine == "MCV1",
year %in% c(1990, 2000, 2010, 2019)) %>%
ggplot() +
aes(x = "",
y = coverage,
fill = continent) +
geom_boxplot() +
scale_fill_brewer(palette = "Set2", direction = 1) +
theme_bw() +
theme(axis.text.x = element_text(angle = 45,
vjust = 1,
hjust = 1),
plot.margin = unit(c(1, 1, 1, 1), "cm"),
legend.position = "right") +
facet_wrap(vars(year), ncol = 4) +
labs(title = "Cobertura vacinal contra o sarampo",
subtitle = "Primeira dose (MCV1)",
x = "Região UNICEF",
y = "Cobertura vacinal (%)",
fill = "Região UNICEF")
#Visualizar
boxplot_years
## Warning: Removed 37 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
# Cores
#Mudando a paleta
library(ggsci)
library(scales)
##
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
##
## discard
## The following object is masked from 'package:readr':
##
## col_factor
vignette("ggsci")
## starting httpd help server ...
## done
nrc = pal_npg("nrc", #Especificar paleta
alpha = 0.7)(8) #Gerar 8 cores com transparencia = 70%
nrc %>%
show_col()
boxplot_years +
scale_fill_npg()
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
## Warning: Removed 37 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
#Boxplot simples de ano
boxplot_regions = cobertura_vacinal %>%
filter(type == "country",
vaccine == "MCV1",
year %in% c(1990, 2000, 2010, 2020)) %>%
mutate(year = as.factor(year)) %>%
ggplot() +
aes(x = year, y = coverage, fill = year) +
geom_boxplot() +
geom_jitter(aes(label = name),
alpha = 0.2,
na.rm = T) +
scale_fill_brewer(palette = "Set2", direction = 1) +
scale_color_distiller(palette = "Set2", direction = 1) +
theme_minimal() +
facet_wrap(vars(continent)) +
scale_fill_npg()
## Warning in geom_jitter(aes(label = name), alpha = 0.2, na.rm = T): Ignoring
## unknown aesthetics: label
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
boxplot_regions
## Warning: Removed 37 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
# Gráfico interativo
boxplot_regions %>%
ggplotly()
## Warning: Removed 37 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
#Boxplot por vacina
cobertura_vacinal %>%
filter(type == "country",
year == 2015) %>%
ggplot() +
aes(x = "", y = coverage, fill = continent) +
geom_boxplot() +
scale_fill_viridis_d(option = "plasma", direction = 1) +
theme_minimal() +
facet_wrap(vars(vaccine)) +
labs(x = "Regiões",
y = "Cobertura",
titulo = "Cobertura vacinal por região, em 2000") +
scale_fill_lancet()
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
## Warning: Removed 216 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
# Múltiplos gráficos ----
#Todas as linhas
cobertura_vacinal %>%
filter(year >= 2012 & year <= 2022) %>%
filter(region %in% "LACR") %>%
ggplot() +
aes(x = year, y = coverage, color = name) +
geom_line() +
theme_minimal() +
facet_wrap(vars(vaccine), scales = "free_x")
#Fica muito poluído
#Highlight linhas específicas
#Método 1
br_cov = cobertura_vacinal %>%
filter(year >= 2012 & year <= 2022,
name %in% c("Brazil", "Colombia")) %>%
ggplot() +
aes(x = year,
y = coverage,
colour = name) +
geom_line(linewidth = 2) +
theme_minimal() +
facet_wrap(vars(vaccine)) +
labs(title = "Cobertura vacinal, por vacina",
x = "Ano",
y = "Cobertura (%)") +
scale_color_npg()
br_cov
#Método 2
br_cov = cobertura_vacinal %>%
filter(year >= 2012 & year <= 2022,
region %in% c("LACR")) %>%
ggplot() +
geom_line(aes(x = year,
y = coverage,
colour = name),
linewidth = 2) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90)) +
facet_wrap(vars(vaccine)) +
labs(title = "Cobertura vacinal, por vacina",
x = "Ano",
y = "Cobertura (%)") +
gghighlight(name %in% c("Brazil", "Colombia"),
calculate_per_facet = T, #Add quando tiver facets
unhighlighted_params = list(linewidth = 1,
colour = "gray90",
alpha = 0.3)) +
scale_color_npg()
## New names:
## • `...1` -> `...15`
## Warning: Tried to calculate with group_by(), but the calculation failed.
## Falling back to ungrouped filter operation...
## label_key: name
br_cov
## Warning: Removed 175 rows containing missing values or values outside the scale range
## (`geom_line()`).
#Mortes
br_mortes = mortes_doencas %>%
filter(year >= 2012 & year <= 2022,
region_complete == "Latin America and Caribbean") %>%
select(name, year, total_deaths, death_rate_100thousand, death_disease) %>%
distinct() %>%
drop_na(total_deaths) %>%
ggplot() +
geom_line(aes(x = round(year, 0),
y = total_deaths,
colour = name),
linewidth = 2) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90))+
facet_wrap(vars(death_disease),
scales = "free",
nrow = 3) +
labs(title = "Mortes por doença imunoprevenível",
x = "Ano",
y = "Mortes") +
#highlight
gghighlight(name %in% c("Brazil", "Colombia"), #Linhas somente com name == "Brazil'
calculate_per_facet = T, #Add quando tiver facets
unhighlighted_params = list(linewidth = 1, #Opções para linhas não marcadas
colour = "gray90",
alpha = 0.5)) +
scale_color_npg()
## Warning: Tried to calculate with group_by(), but the calculation failed.
## Falling back to ungrouped filter operation...
## label_key: name
br_mortes
# Unir gráficos
br_cov + br_mortes
## Warning: Removed 175 rows containing missing values or values outside the scale range
## (`geom_line()`).
#Salvar
ggsave(br_cov + br_mortes,
file = "br_cov_mortes.png",
width = 15, #Largura
height = 10) #Altura
## Warning: Removed 175 rows containing missing values or values outside the scale range
## (`geom_line()`).
Este modelo é útil para você criar gráficos de forma mais fácil, considerando as layers, funções e argumentos mais utilizados no ggplot. Caso queira gerar outros tipos de gráficos, use diferentes geometrias e consulte o (R graph gallery)[https://r-graph-gallery.com/].
Selecione todo o código e segure Ctrl + Shift + C para tornar as linhas executáveis.
# # Filtrar tabela
# latin_2000_2023 %>%
# filter(vaccine %in% c("MCV1")) %>%
# mutate(name = fct_reorder(name, median)) %>%
#
# #Criar base do gráfico
# ggplot() +
# aes(x = x,
# y = y,
# colour = ) + #Aesthetics (o que cada elemento representa)
#
# #Geometria
# geom_point(shape = "circle",
# size = 1) +
#
# geom_text(aes(y = )) +
#
# #Tema, aparência
# theme_light() +
#
# #Escala de cores
# scale_colour_gradient(low = "#DC0000B2",
# high = "#4DBBD5B2") +
#
# # Labels, titulo, subtitulo, titulo dos eixos
# labs(
# title = "",
# subtitle = "",
# y = "",
# x = "",
# tag = "",
# caption = "Fonte:") +
#
# # Aparência especifica
# theme(
#
# #Texto geral
# text = element_text(family = "",
# color = ""),
#
# #Título, subtítulo e tag
# plot.title = element_text(size = 12,
# face = "bold",
# hjust = 0,
# vjust = 0.5),
# plot.subtitle = element_text(size = 10),
# plot.tag.position = "topleft",
# plot.tag = element_text(vjust = 5,
# size = 12,
# face = "bold"),
# #Eixos
# axis.title.x = element_text(size = 10,
# angle = 0,
# color = "black"),
# axis.text.x = element_text(color = "black",
# size = 8,
# angle = 90),
# axis.text.y = element_text(size = 8,
# color = "black"),
#
# #Margens do gráfico
# plot.margin = unit(c(0, #Top
# 0, #Right
# 0, #Bottom
# 0), #Left
# "cm") #Unidade)
# ) +
#
# #Marcações
# #Linhas
# geom_hline(yintercept = "Brazil",
# colour = "blue") +
# geom_hline(yintercept = "Haiti",
# colour = "red") +
# geom_vline(xintercept = 95,
# colour = "black",
# size = 1,
# linetype = 1
# )
Quantos países por continente registraram os dados na UNICEF?
#Quantos países por continente registraram os dados na UNICEF?
#Todos os continentes juntos
cobertura_vacinal %>%
filter(type == "country",
continent != "Other") %>%
select(coverage, year, continent, vaccine) %>%
drop_na(coverage) %>%
ggplot() +
aes(x = year, fill = continent) +
geom_histogram(bins = 43L) +
theme_minimal() +
facet_wrap(vars(vaccine)) +
scale_fill_npg()
Continentes separados
# Continentes separados
cobertura_vacinal %>%
filter(type == "country",
continent != "Other") %>%
select(coverage, year, continent, vaccine) %>%
drop_na(coverage) %>%
ggplot() +
aes(x = year, fill = continent) +
geom_histogram(bins = 43L) +
scale_fill_hue(direction = 1) +
theme_minimal() +
facet_grid(continent ~ vaccine,
scales = "free") +
theme(axis.text.x = element_text(angle = 90))
Quantos países aumentaram sua cobertura vacinal em cada decada?
#Quantos países aumentaram sua cobertura vacinal em cada decada?
cobertura_vacinal %>%
filter(type == "country",
continent != "Other",
year %in% c(1990, 2000, 2010, 2019)) %>%
ggplot() +
aes(x = coverage, fill = continent) +
geom_histogram(bins = 10L) +
theme_minimal() +
theme(plot.caption = element_text(size = 13L),
legend.position = "top",
axis.text.x = element_text(angle = 90),
strip.text.y = element_text(angle = 0,
hjust = 0)) +
facet_grid(~vaccine~year, scales = "free")
## Warning: Removed 1913 rows containing non-finite outside the scale range
## (`stat_bin()`).
#8. Avançado: Dados demográficos e economicos com o Gapminder
O gapminder é um site e um pacote que apresenta diferentes dados sobre países ao longo dos anos. O pacote do R traz uma tabela dos anos 50 até 2007, com dados sobre expectativa de vida, PIB percapita e tamanho da população.
gapminder %>%
filter(year %in% c(1952, 1982, 2002)) %>%
ggplot() +
aes(
x = gdpPercap,
y = lifeExp,
colour = continent,
size = pop,
group = country
) +
geom_point(shape = "circle") +
scale_x_continuous(trans = "log10") +
theme_minimal() +
facet_wrap(vars(year), scales = "free_x") +
gghighlight(country == "China") +
scale_color_npg()